#define xuser mixc::powerful_cat
#include"lang/cxx/find.hpp"
#include"lang/cxx/ignore_case.hpp"
#include"lang/cxx.hpp"
#include"mixc.hpp"
#include"utils/counter.hpp"

xinit(xuser::the_main){
    using namespace xuser;
    counter demo = 0;

    auto when_match = [](cxx_position pos){
        // i_th 表示第几个，从 0 开始计数
        // offset 表示当前找到的字符所在字符串的索引
        xhint(pos->i_th, pos->offset);
    };

    // 演示：查找所有出现过的特定字符（串）
    {
        xhint(demo);
        
        // 查找所有字符 'a' 出现的位置，并返回匹配次数
        //         0123456789abcdef
        xhint(c08("abcdAa").find('a', when_match));
        xhint(c08("aabaAaaaA12345aa").find("aa", when_match));

        // 查找所有字符 'a' 出现的位置，忽略大小写，并返回匹配次数
        xhint(c08("abcdA").find('a', ignore_case<char>, when_match));
        xhint(c08("aabaAaa").find("aa", ignore_case<char>, when_match));
    }

    // 演示: 使用比较回调函数
    {
        xhint(demo);

        // ignore_case<char> 是回调的一种
        auto str = c08("hello_world");

        // 寻找所有数值 >= 'h' 的字符
        auto match_count = str.find('h', xcmpx(item, pattern, char){
            // 约定:
            //// left 为待匹配字符串的字符，right 为匹配参数字符 'h'
            // item 为待匹配字符串的字符，pattern 为匹配参数字符 'h'
            // 0 表示相等（匹配），正数表示左边（item）大于右边（pattern），负数表示右边大于左边
            return item >= pattern ? 0 : 1;
        }, [&](cxx_position pos){
            // i_th 表示第几个，从 0 开始计数
            // offset 表示当前找到的字符所在字符串的索引
            xhint(pos->i_th, pos->offset, str[pos->offset]);
        });
        xhint(match_count);
    }

    // 演示: 寻找第 N 个匹配的内容 
    {
        xhint(demo);

        auto str = c08("hello_world");

        // 查找第 0 个 'o'，位置在 index 4
        xhint(str.find('o', 0));

        // 查找第 1 个 'o'，位置在 index 7
        xhint(str.find('o', 1));

        // 查找第 2 个 'o'，不存在，返回 not_exist
        xhint(str.find('o', 2));

        // 可以查字符串，这里不赘述
    }

    // 演示: 寻找倒数第 N 个匹配的内容 
    {
        xhint(demo);

        //              0123456789a
        auto str = c08("hello_world");

        // 查找倒数第 0 个 'o'，位置在 index 7
        xhint(str.find('o', -1));

        // 查找倒数第 1 个 'o'，位置在 index 4
        xhint(str.find('o', -2));

        // 查找倒数第 2 个 'o'，不存在，返回 not_exist
        xhint(str.find('o', -3));

        // 可以查字符串，这里不赘述
    }

    // 演示:
    // 寻找倒数第 N 个匹配的内容，特殊情况
    // find(xxx, -1) 和 find_reverse(xxx, 0) 是等价的，倒数模式和当前匹配的方式不完全一样
    //
    // 目前这个行为待定，看是考虑便捷高效性还是一致性，如果是考虑一致性，那么这个函数的这部分需要重新设计
    // ！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！
    // ！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！
    {
        xhint(demo);

        auto str = c08("aaa");

        // 反向查找倒数第 0 个 "aa"，位置在 index 1
        xhint(str.find("aa", -1));

        // 不存在
        xhint(str.find("aa", -2));

        // 反向查找第 0 个 "aa"，位置在 index 0
        xhint(str.find("aa", 0));

        // 不存在
        xhint(str.find("aa", 1));
    }

    // 演示: unicode 字符
    {
        xhint(demo);

        // 中文 utf-8 占 3 个字节，ascii 占 1 个字节，
        // 但 utf-8 标准支持 6 个字节的编码，所以不要假定编码长度一定是 3 
        //                3   9   15
        //              0   6   12
        auto str = c08("小猫欢迎您~");
        xhint(str.find("猫", 0)); // 3
        xhint(str.find("~", 0)); // 15
    }
};
